# coding:utf-8

'''

__str__

定义该函数，当print当前实例化对象的时候，会返回该函数的return信息，通常会返回一个字符串，介绍该类的信息

def __str__(self):
    return ''

=================================
__getattr__

当调用的属性或者方法不存在的时候，会返回该方法定义的信息

def __getattr__(self,key):
    print(something)

key:调用任意不存在的属性名

控制对象获取属性的行为
=================================
__setattr__

拦截当前类中不存在的属性与值

def __setattr__(self,key,value):
    self.__dict__[key] = value

key 当前属性名
value 当前参数对应的值

控制实例化对象设置属性的行为
=================================
__call__

将一个类变成一个函数

def __call__(self,*args,**kwargs):
    ....

 
'''


class Test(object):
    def __str__(self):
        return 'this is self description'
    def __getattr__(self,key):
        print('thi is key:{} is not found'.format(key))
    def __setattr__(self,key,value):
        if key not in self.__dict__:
            self.__dict__[key] = value
    def __call__(self,*args,**kwargs):
        print("这里让对象拥有实例化行为")
tt = Test()
# __str__
print(tt)
# __getattr__
tt.a
# __setattr__
tt.name = "test"
print(tt.name)
# __call__
tt(1,2,3,4,age=12)






